const gulp = require('gulp');
const uuid = require('uuid');
const spaceid = require('./feidao.json').spaceid;

gulp.task('build-html', () => {
	const through = require('through2');
	const rename = require('gulp-rename');
	const path = require('path');
	const minifyHtml = require("gulp-minify-html");
	return gulp.src('./src/**/html.ts')
		.pipe(rename((file) => {
			const page_no = file.dirname;
			file.basename = page_no;
			file.extname = '.html';
			file.dirname = '../pages';
		}))
		.pipe(through.obj((chunk, enc, callback) => {
			const page_no = path.basename(chunk.path, '.html');
			const head = Buffer.from(`<!DOCTYPE html>
			<html>

			<head>
				<meta charset="UTF-8">
				<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
				<meta name="apple-mobile-web-app-capable" content="yes" />
				<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
				<meta name="renderer" content="webkit">
				<link rel="stylesheet" type="text/css" href="../css/iconfont.css">
				<link href="https://cdn.jsdelivr.net/npm/feidao-css/feidao.css" type="text/css" rel="stylesheet">
				<link rel="stylesheet" type="text/css" href="../css/daoke.css">
				<script src="../../node_modules/@dojo/loader/loader.js"></script>
				<script type="text/javascript">
					(function(){
						require.config({
							baseUrl: '../../node_modules/',
							packages: [{
								name: 'daoke',
								location: '../dist/'
							},{
								name: '@feidao-factory/core',
								location: '@feidao-factory/core/umd'
							},{
								name: '@feidao-factory/send-msg',
								location: '@feidao-factory/send-msg/umd'
							},{
								name: '@feidao-factory/web',
								location: '@feidao-factory/web/umd'
							},{
							},{
								name: '@feidao-factory/nodejs',
								location: '@feidao-factory/nodejs/umd'
							},{
								name: '@feidao-factory/atom-web',
								location: '@feidao-factory/atom-web/umd/'
							},{
							},{
								name: '@feidao-factory/atom-nodejs',
								location: '@feidao-factory/atom-nodejs/umd/'
							},{
								name: '@feidao-factory/atom-nodejs/msg',
								location: '@feidao-factory/atom-nodejs/umd/msg-b'
							},{
								name: '@feidao-factory/atom-nodejs/authorization',
								location: '@feidao-factory/atom-nodejs/umd/authorization-b'
							},{
								name: '@feidao-factory/widgets',
								location: '@feidao-factory/widgets/umd'
							},{
								name: '@feidao-factory/widgets/fd-w000007',
								location: '@feidao-factory/widgets/umd',
								main: 'fd-w000007-d'
							},{
								name: '@feidao-factory/animation',
								location: '@feidao-factory/animation/umd',
								main: 'index'
							},{
								name: 'node-html-parser',
								location: 'node-html-parser/dist/umd',
								main: 'index'
							},{
								name: 'javascript-state-machine',
								location: './javascript-state-machine',
								main: 'state-machine'
							},{
								name: 'dask',
								location: 'dask/umd',
								main: 'index'
							},{
								name: 'mqtt',
								location: './mqtt/dist',
								main: 'mqtt'
							},{
								name: 'dot',
								location: 'dot',
								main: 'doT'
							},{
								name: 'nools-ts',
								location: 'nools-ts/umd'
							},{
								name: 'lodash-ts',
								location: 'lodash-ts/umd'
							},{
								name: 'he',
								location: './he',
								main: 'he.js'
							},{
								name: 'quill',
								location: './quill/dist',
								main: 'quill.min'
							},{
								name: '@feidao/bscroll',
								location: './@feidao/bscroll/dist',
								main: "bscroll.js"
							},{
								name: 'jstree',
								location: './jstree/dist',
								main: 'jstree'
							},{
								name: 'jquery',
								location: './jquery/dist',
								main: 'jquery'
							}, {
								name: '@feidao/datepicker.js',
								location: './@feidao/datepicker.js',
								main: 'datepicker'
							}, {
								name: 'bootstrap-multiselect',
								location: './bootstrap-multiselect',
								main: 'dist/js/bootstrap-multiselect'
							},{
								name: 'uppy',
								location: './uppy/dist',
								main: 'uppy'
							}, {
								name: 'echarts',
								location: './echarts/dist',
								main: "echarts"
							}, {
								name: 'echarts/theme',
								location: './echarts/theme/'
							}, {
								name: 'three',
								location: './three/build/',
								main: "three.js"
							}, {
								name: 'qiniu-js',
								location: './qiniu-js/dist/',
								main: "qiniu.min.js"
							}, {
								name: '@taoqf/slim-select',
								location: '../node_modules/@taoqf/slim-select/dist',
								main: 'slimselect'
							}, {
								name: 'select2',
								location: '../node_modules/select2/dist/js',
								main: 'select2.js'
							}, {
								name: 'mathjs',
								location: '../node_modules/mathjs/dist/',
								main: 'math.min.js'
							}]
						});
					})();
				</script>
			</head>
			<body>`, 'utf8');
			const tail = Buffer.from(`
			<script type="text/javascript">
				function get_sessionid(){
					const cookie = document.cookie;
					let sessionid = '';
					if (cookie) {
						if (cookie.indexOf('sessionid') > -1) {
							const coks = cookie.split(';');
							const sess = coks.filter((item) => {
								return item.indexOf('sessionid') > -1;
							});
							if (sess.length > 0) {
								const obj = {};
								sess.forEach((se) => {
									const info = se.trim().split('=');
									obj[info[0]] = info[1];
								});
								sessionid = obj.sessionid;
							}
						}
					}
					return sessionid;
				}
				(function(){
					window.host = \`http://\${window.location.hostname}:8889\`;
					window.mqtt_uri = 'mqtt://192.168.40.196:9001';
					require(['daoke/${page_no}/n'],function(main){
						var url = window.location.href;
						main.default(url, {cookie:{}}, {
							spaceid: '${spaceid}',
							sessionid: get_sessionid() || '${uuid()}',
							actionid: '${uuid()}'
						}).then(function(res){
							// 去掉n返回页面的头部内容，只留body内容
							const data = res.data;
							const content = data.match(/<body[\\s|\\S]+>([\\s|\\S]+)<\\/body>/);
							document.body.innerHTML = content[0];
							require(['daoke/${page_no}/b']);
						});
					});
				})();
			</script>
			</body></html>`, 'utf8');
			// const body = chunk.contents.toString('utf8');
			chunk.contents = Buffer.concat([head, /*Buffer.from(body.substring(body.indexOf('`') + 1, body.lastIndexOf('`'))), */tail]);
			// this.push(chunk);
			// callback();
			callback(null, chunk);
		}))
		.pipe(minifyHtml()) //压缩
		.pipe(gulp.dest('./dist/pages/'));
});

gulp.task('browser-sync', () => {
	const browserSync = require('browser-sync').create();
	browserSync.init({
		files: ['./dist/'],
		server: {
			baseDir: './dist/pages',
			directory: true
		},
		online: true,
		host: '127.0.0.1',
		open: 'external',
		serveStatic: ['./'],
		port: 8000
	});
});

gulp.task('watch-tpl', () => {
	const fs = require('fs');
	return gulp.watch('src/**/*.tpl')
		.on('change', (file) => {
			const tpl = file.replace('.tpl', '.ts');
			const content = fs.readFileSync(file, 'utf8');
			fs.writeFileSync(tpl, `export default \`${content}\`;\n`);
		})
		.on('add', (file) => {
			const tpl = file.replace('.tpl', '.ts');
			fs.writeFileSync(tpl, `export default '';\n`);
		});
});

gulp.task('dev', gulp.parallel('build-html', 'watch-tpl', 'browser-sync'));

gulp.task('webpack', (cb) => {
	const dest = './dist/js/';
	const pack_file_path = `./dist/*/b.js`;
	const path = require('path');
	const webpack = require('webpack');
	const through = require('through');
	const ws = require('webpack-stream');
	return gulp.src([pack_file_path])
		.pipe(((opts) => {
			return through(function (file) {
				file.named = path.basename(path.dirname(file.path));
				this.queue(file);
			});
		})())
		.pipe(ws({
			mode: 'production',
			// mode: 'development',
			optimization: {
				splitChunks: {
					name: 'feidao',
					chunks: 'all'
				}
			},
			externals: [
				// "nools" // this is a bad js file
			],
			output: {
				filename: '[name].js',
				globalObject: 'window',
				publicPath: dest
			},
			module: {
				rules: [{
					test: /\.js$/,
					// exclude: /(node_modules|bower_components)/,
					exclude: /core-js|babel|tus-js-client/,
					use: {
						loader: 'babel-loader'
					}
				}]
			}
		}, webpack))
		.on('error', (e) => {
			cb(e);
		})
		.pipe(gulp.dest(dest));
});

gulp.task('default', gulp.parallel('webpack'));
